package org.asiainfo.common.websocket.interceptor;

import cn.dev33.satoken.exception.NotLoginException;
import lombok.extern.slf4j.Slf4j;
import org.asiainfo.common.satoken.utils.LoginHelper;
import org.asiainfo.system.api.model.LoginUser;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import java.util.Map;

import static org.asiainfo.common.core.constant.WebSocketConstants.LOGIN_USER_KEY;

/**
 * WebSocket握手拦截器
 *
 * @author dotor-ww
 */
@Slf4j
public class WebSocketInterceptor implements HandshakeInterceptor {

    /**
     * 在握手之前执行的方法
     *
     * @param request    当前请求
     * @param response   当前响应
     * @param wsHandler  当前WebSocket处理器
     * @param attributes 当前属性
     * @return 是否继续握手
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
        try {
            LoginUser loginUser = LoginHelper.getLoginUser();
            attributes.put(LOGIN_USER_KEY, loginUser);
            return true;
        } catch (NotLoginException e) {
            log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());
            return false;
        }
    }

    /**
     * 在握手之后执行的方法
     *
     * @param request   当前请求
     * @param response  当前响应
     * @param wsHandler 当前WebSocket处理器
     * @param exception 异常信息
     */
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {

    }
}
